package com.demo.java.OD51_100.OD92;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【众数和中位数】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145658019
 */
public class OdMain {
    public static void main(String[] args) {
        try {
            // 创建一个 Scanner 对象，用于读取用户输入
            Scanner s = new Scanner(System.in);
            // 读取输入的数字集合（以空格分隔）
            String inputValues = s.nextLine();

            // 创建一个 HashMap 用于存储数字及其出现次数
            Map<Integer, Integer> myMap = new HashMap<>();

            // 将输入的字符串按空格分割成数组
            String[] chars = inputValues.split(" ");

            // 统计每个数字的出现次数
            Arrays.stream(chars).forEach(x -> {
                // 将字符串转换为整数
                int i = Integer.parseInt(x);
                // 更新数字的出现次数，getOrDefault 确保即使数字没有出现过也能正常处理
                myMap.put(i, myMap.getOrDefault(i, 0) + 1);
            });

            // 找到出现次数最多的频率
            Integer maxValue = myMap.values().stream().max(Integer::compareTo).get();

            // 找出频率最高的数字，并按升序排列
            List<Integer> resultList = myMap.keySet().stream()
                    // 只保留出现次数等于最大频率的数字
                    .filter(k -> maxValue.equals(myMap.get(k)))
                    // 按升序排列
                    .sorted(Integer::compareTo)
                    .collect(Collectors.toList());

            // 计算中位数
            Integer result = 0;
            int size = resultList.size();
            if (resultList.size() % 2 == 0) {
                // 偶数个元素时，取中间两个数的平均值
                result = (resultList.get(size / 2) + resultList.get(size / 2 - 1)) / 2;
                System.out.print(result);
            } else {
                // 奇数个元素时，取中间的数
                result = resultList.get(size / 2);
                System.out.print(result);
            }
        } catch (Exception e) {
            // 如果发生异常，输出异常信息并提示输入错误
            e.printStackTrace();
            System.out.println("input error");
        }
    }
}
